<?php

require_once(BaseConfig::LoadClass('conecta_postgress.class.php'));
require_once(BaseConfig::LoadClass('configuracion.class.php'    ));

class TablasLlenado {
  /**
   * Nombre de la carrera con la que se trabajaran estas estadisticas
   * @var string
   */
  var $strNombreCarrera;
  
  /**
   * Conexion a la base de datos
   * @var ConectaP
   */
  var $oConectaP;
  
  function TablasLlenado($strNombreCarrera) {
    if(!$strNombreCarrera) { $strNombreCarrera = "cirden"; } // Poner un default en la carrera
    
    $this->strNombreCarrera = $strNombreCarrera;
    $this->oConectaP = new ConectaP("", $this->strNombreCarrera);
  }
  
  /**
   * Funcion que regresa el periodo al cual pertenece una fecha dada.
   * 
   * Si la carrera es medicina, el periodo se calcula de manera distinta
   * 
   * @param date    $strFecha    La fecha que será calculada, en formato YYYY-MM-DD
   * @param boolean $bolSoloAnio Si solo se requiere la parte del año
   * @param string  $strCarrera  La carrera a la cual pertenece esa fecha
   */
  static function PeriodoDesdeFecha($strFecha, $bolSoloAnio = false, $strCarrera = "") {
    $strAnio = substr($strFecha, 0, 4);
    $strMes  = substr($strFecha, 5, 2);
    
    $strPeriodo = "";
    
    if($strCarrera == "medicina") {
      // Es medicina: el periodo es el mismo que el año
      $strPeriodo = "{$strAnio}0";
    }
    
    if($strMes > 7) {
      $strPeriodo = ($strAnio + 1) . "1";
    } else {
      $strPeriodo = ($strAnio + 0) . "2";
    }
    
    if($bolSoloAnio) {
      return substr($strPeriodo, 0, 4);
    }
    
    // Ver los periodos para las carreras de un año
    switch($strCarrera) {
      case "cirden": case "enfermeria": case "medicina":
        $strPeriodo = substr($strPeriodo, 0, 4) . "0";
        break;
    }
    
    return $strPeriodo;
  }
  
  /**
   * Funcion que regresa un arreglo con los nombres de las bases de datos y la
   * descripcion de las carreras.
   */
  static function GetArrayNombresCarreras() {
    $arrNomCarr = array();
    $arrNomCarr["cirden"     ] = "Cirujano Dentista" ;
    $arrNomCarr["biologia"   ] = "Biologia"          ;
    $arrNomCarr["medicina"   ] = "Medicina"          ;
    $arrNomCarr["enfermeria" ] = "Enfermeria"        ;
    $arrNomCarr["ing_quimica"] = "Ingenieria Quimica";
    $arrNomCarr["psicologia" ] = "Psicologia"        ;
    $arrNomCarr["qfb"        ] = "Q. F. B"           ;
    
    return $arrNomCarr;
  }
  
  /**
   * Funcion que genera el form para la seleccion de la carrera
   * 
   * @param string $strNombreCarrera   Codigo interno de la carrera
   * @param array  $arrGeneraciones    Arreglo con las generaciones marcadas por default
   * @param int    $intTipoAnio        Tipo de generaciones que se mostraran (1 => años normales (2007, 2008, 2009, etc), 2 => Semestres completos (2012-0, 2012-1, 2012-2, etc) 3 => Semestres Extraordinarios (EA11, EB11, etc))
   * @param int    $intNumRows         Si se manda, se generara el form dentro de un tr con un th colspan=numero_mandado
   * @param string $strExtraDatosForma Codigo extra que se mandara en la forma (Otros inputs)
   * 
   * @return string
   */
  static function __TemplateSeleccionCarrera($strNombreCarrera, $arrGeneraciones, $intTipoAnio = 1, $intNumRows = 0, $strExtraDatosForma = "") {
    $oConfig           = new Config();
    $strPeriodoInicial = $oConfig->Get('periodo_inicial', "2007");
    $strPeriodoFinal   = $oConfig->Get('periodo_final'  , "2015");
    switch($intTipoAnio) {
      case 1:
        for($i = $strPeriodoInicial; $i <= $strPeriodoFinal; $i++) {
          $arrOpcionesPer[$i] = $i;
        }
        $intNumChecks = 10;
        break;
        
      case 2:
        for($i = $strPeriodoInicial; $i <= $strPeriodoFinal; $i++) {
          /*
          switch($strNombreCarrera) {
            case 'cirden': case 'medicina': case 'enfermeria':
              $arrOpcionesPer["$i-0"] = "$i-0";
              break;
            default:
              $arrOpcionesPer["$i-1"] = "$i-1";
              $arrOpcionesPer["$i-2"] = "$i-2";
              break;
          }
          */
              $arrOpcionesPer["$i-0"] = "$i-0";
              $arrOpcionesPer["$i-1"] = "$i-1";
              $arrOpcionesPer["$i-2"] = "$i-2";
        }
        $intNumChecks = 6;
        break;
        
      case 3:
        for($i = $strPeriodoInicial; $i <= $strPeriodoFinal; $i++) {
          $strPA = substr($i, 2, 2);
          $arrOpcionesPer["EA$strPA"] = "EA$strPA";
          $arrOpcionesPer["EB$strPA"] = "EB$strPA";
        }
        $intNumChecks = 6;
        break;
    }
    
    $arrNomCarr = TablasLlenado::GetArrayNombresCarreras();
    
    $strRes  = "";
    if($intNumRows) {
      $strRes .= "<tr><th colspan='$intNumRows'>";
    }
    $strRes .= "<span class='ui-icon ui-icon-carat-2-n-s' id='MostrarOcultarSeleccionCarrera'></span>";
    $strRes .= "<div id='div_seleccion_carrera'>";
    $strRes .= "<form action='index.php' method='POST'>";
    $strRes .= "<input type='hidden' name='option' value='" . Variables::GetPageOption() . "'>";
    $strRes .= Variables::GetSelectByArray($arrNomCarr, $strNombreCarrera, "carrera");
    $strRes .= "<input type='checkbox' id='chb_sel_all' onclick='SelectAllCheckboxesPeriodos(\"ClaseCheckPeriodos\")' /> Seleccionar todos los periodos";
    $strRes .= Variables::GetCheckboxesByArray($arrOpcionesPer, $arrGeneraciones, "generaciones[]", $intNumChecks, false, "width='100%'", "", 0, "class='ClaseCheckPeriodos'");
    $strRes .= $strExtraDatosForma;
    $strRes .= "<input type='submit' value='Generar' />";
    $strRes .= "</form>";
    $strRes .= "</div>";
    if($intNumRows) {
      $strRes .= "</th></tr>";
    }
    
    Template::AgregarArchivoExtra_S("scripts_comunes.js");
    
    return $strRes;
  }
  
  /**
   * Funcion que genera la tabla de egresados TC
   * 
   * Si el parametro $intGeneracion es un arreglo, se mostraran los resultados 
   * para todas esas generaciones
   * 
   * @param int     $intGeneracion       Generacion a consultar
   * @param boolean $bolMostrarETR       Si se mostraran los alumnos ETR (regular = 2) en vez de los TC (regular = 1)
   * @param boolean $bolMostrarConsultas Si se mostraran las consultas usadas
   */
  function EgresadosTC($intGeneracion, $bolMostrarETR = false, $bolMostrarConsultas = false) {
    if(is_array($intGeneracion)) {
      $arrGeneraciones = $intGeneracion;
    } else {
      $arrGeneraciones = array($intGeneracion);
    }
    
    $arrConsultas = array();
    
    $arrNomCarr = TablasLlenado::GetArrayNombresCarreras();
    $strRes  = "";
    $strRes .= "<table class='TablaReportes'>";
    $strRes .= "<tr><th colspan='8'>";
    $strRes .= "Carrera: <b>{$arrNomCarr[$this->strNombreCarrera]}</b>";
    if($bolMostrarETR) {
      $strRes .= " (Egresados Tiempo Reglamentario [ETR] )";
    } else {
      $strRes .= " (Egresados Tiempo Curricular [TC] )";
    }
    $strRes .= "</th></tr>";
    $strRes .= "<tr>";
    $strRes .= "<th>Generacion</th>";
    $strRes .= "<th>Ciclo Escolar</th>";
    $strRes .= "<th># de alumnos</th>";
    $strRes .= "<th># de alumnos egresados</th>";
    $strRes .= "<th>ETC</th>";
    $strRes .= "<th>50% - 75% creditos</th>";
    $strRes .= "<th>75% - 99% creditos</th>";
    $strRes .= "<th>100% creditos</th>";
    $strRes .= "</tr>";
    
    foreach($arrGeneraciones as $intGeneracionAct) {
      // Primero ver cuantos alumnos son en total de egresados
      $strConsulta  = "";
      $strConsulta .= "SELECT COUNT(*) AS total_gen ";
      $strConsulta .= "FROM view_estadisticas_egresados ";
      $strConsulta .= "WHERE generacion = $intGeneracionAct ";
      $arrConsultas[] = $strConsulta;
      $this->oConectaP->Consulta($strConsulta);
      $intTotalAlumnos = $this->oConectaP->Field('total_gen');
      
      // Luego ver cuantos alumnos son en total de egresados en tiempo (TC)
      $strConsulta  = "";
      $strConsulta .= "SELECT COUNT(*) AS total_eg ";
      $strConsulta .= "FROM view_estadisticas_egresados ";
      $strConsulta .= "WHERE generacion = $intGeneracionAct ";
      $strConsulta .= "  AND egresado = 't' ";
      if($bolMostrarETR) {
        $strConsulta .= "  AND regular = 2 ";
      } else {
        $strConsulta .= "  AND regular = 1 ";
      }
      $arrConsultas[] = $strConsulta;
      $this->oConectaP->Consulta($strConsulta);
      $intTotalAlumnosTC = $this->oConectaP->Field('total_eg');
      
      // Luego ver cuantos alumnos tienen entre el 50 y el 75% de creditos
      $strConsulta  = "";
      $strConsulta .= "SELECT COUNT(*) AS total_r1 ";
      $strConsulta .= "FROM view_estadisticas_egresados ";
      $strConsulta .= "WHERE generacion = $intGeneracionAct ";
      $strConsulta .= "  AND razon_cred >= 0.5 ";
      $strConsulta .= "  AND razon_cred < 0.75 ";
      $arrConsultas[] = $strConsulta;
      $this->oConectaP->Consulta($strConsulta);
      $intTotalAlumnosR1 = $this->oConectaP->Field('total_r1');
      
      // Luego ver cuantos alumnos tienen entre el 75 y el 99% de creditos
      $strConsulta  = "";
      $strConsulta .= "SELECT COUNT(*) AS total_r2 ";
      $strConsulta .= "FROM view_estadisticas_egresados ";
      $strConsulta .= "WHERE generacion = $intGeneracionAct ";
      $strConsulta .= "  AND razon_cred >= 0.75 ";
      $strConsulta .= "  AND razon_cred < 1 ";
      $arrConsultas[] = $strConsulta;
      $this->oConectaP->Consulta($strConsulta);
      $intTotalAlumnosR2 = $this->oConectaP->Field('total_r2');
      
      // Por ultimo vemos cuantos alumnos son en total de egresados
      $strConsulta  = "";
      $strConsulta .= "SELECT COUNT(*) AS total_eg_0 ";
      $strConsulta .= "FROM view_estadisticas_egresados ";
      $strConsulta .= "WHERE generacion = $intGeneracionAct ";
      $strConsulta .= "  AND egresado = 't' ";
      $arrConsultas[] = $strConsulta;
      $this->oConectaP->Consulta($strConsulta);
      $intTotalAlumnosEg0 = $this->oConectaP->Field('total_eg_0');
      
      $strRes .= "<tr " . Variables::AlternarConClase() . ">";
      $strRes .= "<td>$intGeneracionAct</td>";
      $strRes .= "<td>&nbsp;</td>";
      $strRes .= "<td>$intTotalAlumnos</td>";
      $strRes .= "<td>$intTotalAlumnosTC</td>";
      $strRes .= "<td>" . (intval(($intTotalAlumnosTC * 10000) / $intTotalAlumnos) / 100) . "</td>";
      $strRes .= "<td>$intTotalAlumnosR1</td>";
      $strRes .= "<td>$intTotalAlumnosR2</td>";
      $strRes .= "<td>$intTotalAlumnosEg0</td>";
      $strRes .= "</tr>";
    }
    
    if($bolMostrarConsultas) {
      $strRes .= "<tr><th colspan='8'><hr /></th></tr>";
      foreach($arrConsultas as $strConsulta) {
        $strRes .= "<tr " . Variables::AlternarConClase() . ">";
        $strRes .= "<td colspan='8'>$strConsulta</td>";
        $strRes .= "</tr>";
      }
    }
    
    $strRes .= TablasLlenado::__TemplateSeleccionCarrera($this->strNombreCarrera, $arrGeneraciones, 1, 8);
    
    $strRes .= "</table>";
    
    return $strRes;
  }
  
  /**
   * Funcion que obtiene los indices de aprobacion.
   * 
   * Si se pasa $strNombrePeriodo como un arreglo, se mostraran varios periodos.
   * 
   * Se puede pasar $strNombrePeriodo como una cadena de tipo "'2012-1','2012-2'"
   * para obtener valores de varios periodos.
   * 
   * @param string  $strNombrePeriodo     Nombre del periodo (Como "2012-1")
   * @param int     $intMostrarOrdinarios Si se mostraran los periodos ordinarios (1) o los extraordinarios (0)
   * @param boolean $bolMostrarConsultas  Si se mostraran las consultas usadas
   */
  function IndicesAprobacion($strNombrePeriodo, $intMostrarOrdinarios = 1, $bolMostrarConsultas = false) {
    if(is_array($strNombrePeriodo)) {
      // Primero ver si el periodo es un arreglo, y transformarlo
      $strPeriodosReporte = "'" . join("', '", $strNombrePeriodo) . "'";
    } else if(substr(trim($strNombrePeriodo), 0, 1) == "'") {
      // Es una lista de periodos, por lo que ya viene ordenada
      $strPeriodosReporte = $strNombrePeriodo;
    } else {
      // Es un solo periodo: Se necesita formatear para la consulta
      $strPeriodosReporte = "'$strNombrePeriodo'";
    }
    
    // Si son periodos extraordinarios y la carrera es Ingenieria Quimica, se 
    // necesitan plos periodos EY, EZ en vez de EA, EB
    if(($intMostrarOrdinarios == 0) && ($this->strNombreCarrera == "ing_quimica")) {
      $strPeriodosReporte = str_replace("EA", "EY", $strPeriodosReporte);
      $strPeriodosReporte = str_replace("EB", "EZ", $strPeriodosReporte);
    }
    
    $strConsulta  = "";
    $strConsulta .= "SELECT ";
    $strConsulta .= "  periodo   , ";
    $strConsulta .= "  asg_clave , ";
    $strConsulta .= "  asg_nombre, ";
    $strConsulta .= "  naporb    , ";
    $strConsulta .= "  ntotal      ";
    $strConsulta .= "FROM indices_aprob ";
    $strConsulta .= "WHERE periodo IN ($strPeriodosReporte) ";
    $strConsulta .= "ORDER BY periodo ASC, asg_clave ASC ";
    
    // Si son periodos extraordinarios y la carrera es Ingenieria Quimica, se 
    // necesitan plos periodos EY, EZ en vez de EA, EB
    if(($intMostrarOrdinarios == 0) && ($this->strNombreCarrera == "ing_quimica")) {
      $strPeriodosReporte = str_replace("EY", "EA", $strPeriodosReporte);
      $strPeriodosReporte = str_replace("EZ", "EB", $strPeriodosReporte);
    }
    
    $arrDatosNom  = array();
    $arrDatosPer  = array();
    $arrDatosTerm = array();
    
    $this->oConectaP->Consulta($strConsulta);
    while(!$this->oConectaP->EOF) {
      $arrDatosNom [$this->oConectaP->Field('asg_clave')] = $this->oConectaP->Field('asg_nombre'); // Nombre de la materia
      $arrDatosPer [$this->oConectaP->Field('periodo'  )] = $this->oConectaP->Field('periodo'   ); // Nombre del periodo

      $arrDatosTerm[$this->oConectaP->Field('asg_clave')][$this->oConectaP->Field('periodo')]["aprob"] = $this->oConectaP->Field('naporb') - 0;
      $arrDatosTerm[$this->oConectaP->Field('asg_clave')][$this->oConectaP->Field('periodo')]["tot"  ] = $this->oConectaP->Field('ntotal') - 0;
      
      $this->oConectaP->MoveNext();
    }
    
    $arrDatosPer = $this->__OrdenarPeridodos($arrDatosPer, $intMostrarOrdinarios);
    
    $arrNomCarr = TablasLlenado::GetArrayNombresCarreras();
    
    $strTabla  = "";
    $strTabla .= "<table class='TablaReportes'>";
    $strTabla .= "<tr><th colspan='" . ((count($arrDatosPer) * 2) + 1) . "'>";
    $strTabla .= "Indice de aprobacion para {$arrNomCarr[$this->strNombreCarrera]}";
    if($intMostrarOrdinarios == 0) {
      $strTabla .= " (Periodos Extraordinarios)";
    }
    $strTabla .= "</th></tr>";
    $strTabla .= "<tr>";
    $strTabla .= "<th>Asignatura</th>";
    foreach($arrDatosPer as $strNomPer) {
      $strTabla .= "<th>$strNomPer<br />Insc</th>";
      $strTabla .= "<th>$strNomPer<br />Apro</th>";
    }
    $strTabla .= "</tr>\n";

    foreach($arrDatosNom as $strCveMat => $strNomMat) {
      $strTabla .= "<tr " . Variables::AlternarConClase() . ">";
      $strTabla .= "<td>$strCveMat - $strNomMat</td>";

      foreach($arrDatosPer as $strNomPer) {
        $strTabla .= "<td>" . ($arrDatosTerm[$strCveMat][$strNomPer]["tot"  ] - 0) . "</td>";
        $strTabla .= "<td>" . ($arrDatosTerm[$strCveMat][$strNomPer]["aprob"] - 0) . "</td>";
      }
      $strTabla .= "</tr>\n";
    }
    
    if($bolMostrarConsultas) {
      $strTabla .= "<tr><th colspan='" . ((count($arrDatosPer) * 2) + 1) . "'><hr /></th></tr>";
      $strTabla .= "<tr " . Variables::AlternarConClase() . ">";
      $strTabla .= "<td colspan='" . ((count($arrDatosPer) * 2) + 1) . "'>$strConsulta</td>";
    }
    
    $arrGeneraciones = Variables::ArrayIndexSync(Variables::ArrayTrim(explode(",", $strPeriodosReporte), "' "));
    $strTabla .= TablasLlenado::__TemplateSeleccionCarrera($this->strNombreCarrera, $arrGeneraciones, ($intMostrarOrdinarios ? 2 : 3), ((count($arrDatosPer) * 2) + 1));
    
    $strTabla .= "</table>";
    
    return $strTabla;
  }
  
  function __OrdenarPeridodos($arrPeriodos, $intMostrarOrdinarios) {
    if($intMostrarOrdinarios == 1) {
      return $arrPeriodos;
    }
    
    uasort($arrPeriodos, 'srtPeriodoExtraordinario');
    return $arrPeriodos;
  }
  
  /**
   * Funcion que obtiene la suma de los alumnos regulares por generacion.
   * 
   * Si se pasa $intGeneracion como un arreglo, se mostraran varios periodos.
   * 
   * @param string  $intGeneracion       Generacion (como 2011)
   * @param boolean $bolMostrarConsultas Si se mostraran las consultas usadas
   */
  function AlumnosRegulares($intGeneracion, $bolMostrarConsultas = false) {
    if(is_array($intGeneracion)) {
      $arrGeneraciones = $intGeneracion;
    } else {
      $arrGeneraciones = array($intGeneracion);
    }
    
    $arrNomCarr["cirden"     ] = "Cirujano Dentista" ;
    $arrNomCarr["biologia"   ] = "Biologia"          ;
    $arrNomCarr["medicina"   ] = "Medicina"          ;
    $arrNomCarr["enfermeria" ] = "Enfermeria"        ;
    $arrNomCarr["ing_quimica"] = "Ingenieria Quimica";
    $arrNomCarr["psicologia" ] = "Psicologia"        ;
    switch($this->strNombreCarrera) {
      case "biologia": case "ing_quimica": case "psicologia":
        $strUltimoNumero = "1";
        $strUltimoNumero2 = "2";
        break;
      case "cirden": case "medicina": case "enfermeria":
        $strUltimoNumero = "0";
        $strUltimoNumero2 = "0";
        break;
    }
    
    $arrConsultas = array();
    $arrNomCarr   = TablasLlenado::GetArrayNombresCarreras();
    
    $strRes  = "";
    $strRes .= "<table class='TablaReportes'>";
    $strRes .= "<tr><th colspan='5'>Alumnos Regulares de {$arrNomCarr[$this->strNombreCarrera]}</th></tr>";
    $strRes .= "<tr>";
    $strRes .= "<th>Generacion</th>";
    $strRes .= "<th># de alumnos</th>";
    if($strUltimoNumero == "0") {
      $strRes .= "<th>4o A&ntilde;o (Regulares)</th>";
      $strRes .= "<th>3o A&ntilde;o (Regulares)</th>";
      $strRes .= "<th>2o A&ntilde;o (Regulares)</th>";
    } else {
      $strRes .= "<th>7o Semestre (Regulares)</th>";
      $strRes .= "<th>5o Semestre (Regulares)</th>";
      $strRes .= "<th>3o Semestre (Regulares)</th>";
    }
    $strRes .= "</tr>";
    
    foreach($arrGeneraciones as $strGeneracionAct) {
      if(!$strGeneracionAct) continue;
      // Primero se encuentra el numero de alumnos en la generacion
      $strConsulta = "SELECT COUNT(*) AS total_gen FROM view_estadisticas_egresados WHERE generacion = $strGeneracionAct";
      $arrConsultas[] = $strConsulta;
      $this->oConectaP->Consulta($strConsulta);
      $strTotal_Gen = $this->oConectaP->Field('total_gen');
      
      // Ahora buscar los alumnos de esa generacion que ya pasaron a 3 semestres distintos
      unset($arrGen);
      for($i = 0; $i <= 2; $i++) {
        $strConsulta = "SELECT COUNT(*) AS cuantos FROM eficiencia_terminal WHERE prd_revisado = '" . ($strGeneracionAct + $i) . "{$strUltimoNumero2}' AND prd_start LIKE '{$strGeneracionAct}{$strUltimoNumero}%' AND regular = 't'";
        $arrConsultas[] = $strConsulta;
        $this->oConectaP->Consulta($strConsulta);
        $arrGen[$i] = $this->oConectaP->Field('cuantos');
      }
      
      // Ahora pintamos los resultados
      $strRes .= "<tr " . Variables::AlternarConClase() . ">";
      $strRes .= "<td>$strGeneracionAct</td>";
      $strRes .= "<td>$strTotal_Gen</td>";
      $strRes .= "<td>{$arrGen[2]}</td>";
      $strRes .= "<td>{$arrGen[1]}</td>";
      $strRes .= "<td>{$arrGen[0]}</td>";
      $strRes .= "</tr>";
    }
    
    if($bolMostrarConsultas) {
      $strRes .= "<tr><th colspan='5'><hr /></th></tr>";
      foreach($arrConsultas as $strConsulta) {
        $strRes .= "<tr " . Variables::AlternarConClase() . ">";
        $strRes .= "<td colspan='5'>$strConsulta</td>";
        $strRes .= "</tr>";
      }
    }
    
    $strRes .= TablasLlenado::__TemplateSeleccionCarrera($this->strNombreCarrera, $arrGeneraciones, 1, 5);
    
    return $strRes;
  }
}

function srtPeriodoExtraordinario($a, $b) {
  if($a == $b) {
    return 0;
  }
  if(substr($a, 2, 2) > substr($b, 2, 2)) {
    return 1;
  }
  
  if(substr($a, 2, 2) < substr($b, 2, 2)) {
    return -1;
  }
  
  if(substr($a, 2, 2) == substr($b, 2, 2)) {
    if(ord(substr($a, 1, 1)) > ord(substr($b, 1, 1))) {
      return 1;
    } else {
      return -1;
    }
  }
}

?>